package ar.unq.edu.persistencia.gpilla.daos;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeSet;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;

import ar.edu.unq.persistencia.gpilla.Equipo;
import ar.edu.unq.persistencia.gpilla.PartidoAbstract;
import ar.edu.unq.persistencia.gpilla.hibernate.SessionManager;

/**
 * TODO: description
 */
public class EquiposDAO {

    @SuppressWarnings("unchecked")
    public List<Equipo> getListaEquipos() {
        // throw new UnsupportedOperationException();
        Session session = SessionManager.getInstancia().getSession();
        return session.createCriteria(Equipo.class).list();
    }

    public static Equipo getEquipo(final Integer equipo2) {
        Session session = SessionManager.getInstancia().getSession();
        Criteria criteria = session.createCriteria(Equipo.class);
        criteria.add(Expression.eq("id", equipo2));
        Equipo retorno = (Equipo) criteria.uniqueResult();
        return retorno;
    }

    public static List<Equipo> getListaEquiposOrdenadoPorVictoriasDePartidoSimpleAsc() {

        Session session = SessionManager.getInstancia().getSession();
        Map<Equipo, Integer> equipos = new HashMap<Equipo, Integer>();

        Query query = session.createQuery("from PartidoSimple");

        ArrayList<PartidoAbstract> partidos = (ArrayList<PartidoAbstract>) query.list();

        System.out.println("Total Partidos Simples : " + partidos.size());

        int empate = 0;

        for (PartidoAbstract partido : partidos) {
            Equipo ganador = partido.getGanador();
            if (ganador != null) {
                if (equipos.get(ganador) != null) {
                    equipos.put(ganador, equipos.get(ganador) + 1);
                } else {
                    equipos.put(ganador, 1);
                }
            } else {
                // Solo sirve para debug
                empate++;
            }

        }

        // Solo para debug!
        System.out.println("Empataron: " + empate);

        TreeSet<Map.Entry<Equipo, Integer>> equiposOrdenadosTree = new TreeSet<Map.Entry<Equipo, Integer>>(
                new Comparator<Map.Entry<Equipo, Integer>>() {

                    public List<Equipo> getListaEquiposOrdenadoPorVictoriasDePartidoSimpleAsc() {

                        Session session = SessionManager.getInstancia().getSession();
                        Map<Equipo, Integer> equipos = new HashMap<Equipo, Integer>();

                        Query query = session.createQuery("from PartidoSimple");

                        ArrayList<PartidoAbstract> partidos = (ArrayList<PartidoAbstract>) query.list();

                        System.out.println("Total Partidos Simples : " + partidos.size());

                        int empate = 0;

                        for (PartidoAbstract partido : partidos) {
                            Equipo ganador = partido.getGanador();
                            if (ganador != null) {
                                if (equipos.get(ganador) != null) {
                                    equipos.put(ganador, equipos.get(ganador) + 1);
                                } else {
                                    equipos.put(ganador, 1);
                                }
                            } else {
                                // Solo sirve para debug
                                empate++;
                            }

                        }

                        // Solo para debug!
                        System.out.println("Empataron: " + empate);

                        TreeSet<Map.Entry<Equipo, Integer>> equiposOrdenadosTree = new TreeSet<Map.Entry<Equipo, Integer>>(
                                new Comparator<Map.Entry<Equipo, Integer>>() {

                                    @Override
                                    public int compare(final Entry<Equipo, Integer> o1, final Entry<Equipo, Integer> o2) {
                                        return o1.getValue().compareTo(o2.getValue());
                                    }
                                });

                        equiposOrdenadosTree.addAll(equipos.entrySet());
                        ArrayList<Equipo> resultado = new ArrayList<Equipo>();

                        for (Entry<Equipo, Integer> entry : equiposOrdenadosTree) {
                            System.out.println("Equipo : " + entry.getKey() + " - " + entry.getValue());
                            resultado.add(entry.getKey());
                        }

                        return resultado;
                    }

                    public List<Equipo> getListaEquiposOrdenadoPorVictoriasDesc() {

                        Session session = SessionManager.getInstancia().getSession();
                        Map<Equipo, Integer> equipos = new HashMap<Equipo, Integer>();

                        Query query = session.createQuery("from PartidoAbstract");

                        ArrayList<PartidoAbstract> partidos = (ArrayList<PartidoAbstract>) query.list();

                        int empate = 0;

                        for (PartidoAbstract partido : partidos) {
                            Equipo ganador = partido.getGanador();
                            if (ganador != null) {
                                if (equipos.get(ganador) != null) {
                                    equipos.put(ganador, equipos.get(ganador) + 1);
                                } else {
                                    equipos.put(ganador, 1);
                                }
                            } else {
                                // Solo sirve para debug
                                empate++;
                            }

                        }

                        // Solo para debug!
                        System.out.println("Empataron: " + empate);

                        TreeSet<Map.Entry<Equipo, Integer>> equiposOrdenadosTree = new TreeSet<Map.Entry<Equipo, Integer>>(
                                new Comparator<Map.Entry<Equipo, Integer>>() {

                                    @Override
                                    public int compare(final Entry<Equipo, Integer> o1, final Entry<Equipo, Integer> o2) {
                                        return o1.getValue().compareTo(o2.getValue()) * -1;
                                    }
                                });

                        equiposOrdenadosTree.addAll(equipos.entrySet());
                        ArrayList<Equipo> resultado = new ArrayList<Equipo>();

                        for (Entry<Equipo, Integer> entry : equiposOrdenadosTree) {
                            System.out.println("Equipo : " + entry.getKey() + " - " + entry.getValue());
                            resultado.add(entry.getKey());
                        }

                        return resultado;
                    }

                    @Override
                    public int compare(final Entry<Equipo, Integer> o1, final Entry<Equipo, Integer> o2) {
                        return o1.getValue().compareTo(o2.getValue());
                    }
                });

        equiposOrdenadosTree.addAll(equipos.entrySet());
        ArrayList<Equipo> resultado = new ArrayList<Equipo>();

        for (Entry<Equipo, Integer> entry : equiposOrdenadosTree) {
            System.out.println("Equipo : " + entry.getKey() + " - " + entry.getValue());
            resultado.add(entry.getKey());
        }

        return resultado;
    }

    public static List<Equipo> getListaEquiposOrdenadoPorVictoriasDesc() {

        Session session = SessionManager.getInstancia().getSession();
        Map<Equipo, Integer> equipos = new HashMap<Equipo, Integer>();

        Query query = session.createQuery("from PartidoAbstract");

        ArrayList<PartidoAbstract> partidos = (ArrayList<PartidoAbstract>) query.list();

        int empate = 0;

        for (PartidoAbstract partido : partidos) {
            Equipo ganador = partido.getGanador();
            if (ganador != null) {
                if (equipos.get(ganador) != null) {
                    equipos.put(ganador, equipos.get(ganador) + 1);
                } else {
                    equipos.put(ganador, 1);
                }
            } else {
                // Solo sirve para debug
                empate++;
            }

        }

        // Solo para debug!
        System.out.println("Empataron: " + empate);

        TreeSet<Map.Entry<Equipo, Integer>> equiposOrdenadosTree = new TreeSet<Map.Entry<Equipo, Integer>>(
                new Comparator<Map.Entry<Equipo, Integer>>() {

                    @Override
                    public int compare(final Entry<Equipo, Integer> o1, final Entry<Equipo, Integer> o2) {
                        return o1.getValue().compareTo(o2.getValue()) * -1;
                    }
                });

        equiposOrdenadosTree.addAll(equipos.entrySet());
        ArrayList<Equipo> resultado = new ArrayList<Equipo>();

        for (Entry<Equipo, Integer> entry : equiposOrdenadosTree) {
            System.out.println("Equipo : " + entry.getKey() + " - " + entry.getValue());
            resultado.add(entry.getKey());
        }

        return resultado;
    }

}
